import axios, { AxiosInstance } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { Session } from '/@/utils/storage';
import qs from 'qs';

// 配置新建一个 axios 实例
const service: AxiosInstance = axios.create({
	baseURL: '/api',
	timeout: 50000,
	headers: { 'Content-Type': 'application/json' },
	paramsSerializer: {
		serialize(params) {
			return qs.stringify(params, { allowDots: true });
		},
	},
});

// 是否正在请求刷新token接口的标记
let isRefreshing:boolean = false;

// 刷新token的方法
const refreshToken = ():any => {
	return service.post('/auth/token/refresh')
}
// 添加请求拦截器
service.interceptors.request.use(
	(config) => {
		// 在发送请求之前做些什么 token
		if (Session.get('token') && Session.get('token')!=='undefined') {
			console.log('Session.get(token) ===>', Session.get('token'))
			config.headers['Authorization'] = `Bearer ${Session.get('token')}`;
		}
		return config;
	},
	(error) => {
		// 对请求错误做些什么
		return Promise.reject(error);
	}
);

// 添加响应拦截器
service.interceptors.response.use(
	(response) => {
		let res = response.data;
		if (typeof res === 'string') {
			res = JSON.parse(res);
		}
		if (res.code && (res.code !==200 && res.code !== '401')) {
			// `token` 过期或者账号已在别处登录
			if (res.code === 403 || res.code === '403') {
				ElMessage.error('账号密码错误，请重新输入')
			}
			return Promise.reject(service.interceptors.response);
		} else { // 200 401
			if (res.code === 401 || res.code === '401') { // 响应码401，需要重新登录, 这里的code值是跟后端约定好的
				if (!isRefreshing) {
					isRefreshing = true;
					refreshToken().then((res:any) => {
						Session.set('token', res.access_token);
						console.log('---', res)
					}).catch((e: any) => {
						console.log('==========>', res)
						// Session.clear(); // 清除浏览器全部临时缓存
						// window.location.href = "/"; // 去登录页
						// ElMessageBox.alert('你已被登出，请重新登录', '提示', {})
					}).finally(() => {
						isRefreshing = false;
					});
				}
			}
			return response.data;
		}
	},
	(error) => {
		// 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			ElMessage.error('网络超时');
		} else if (error.message == 'Network Error') {
			ElMessage.error('网络连接错误');
		} else {
			if (error.response.data) ElMessage.error(error.response.statusText);
			else ElMessage.error('接口路径找不到');
		}
		return Promise.reject(error);
	}
);

// 导出 axios 实例
export default service;
